package main

import (
	"encoding/xml"
	"github.com/gin-gonic/gin"
	"html/template"
	"math/rand"
	"net/http"
	"time"
)

// main
//
//	@Description: 解析get post参数
func main() {
	engine := gin.Default()
	//设置自定义模板函数
	engine.SetFuncMap(template.FuncMap{})
	//加载html模板,
	engine.LoadHTMLGlob("templates/demo05/*")

	//配置静态web服务  第一参数:路由  第二个参数：映射的目录 就可以直接访问 http://localhost:8888/static/img/8000.jpg
	//可以在其他html模板中引入静态资源，例如 <img src="/static/img/8000.jpg">   <link rel="stylesheet" href="/static/css/base.css">
	engine.Static("static", "./static")

	engine.GET("/index", func(c *gin.Context) {
		c.HTML(200, "demo05/index.html", gin.H{
			"title": "这是一个大大的标题",                              //长度27
			"time":  time.Now().Format("2006-01-02 15:04:05"), //传入到对应的html页面 {{ .time }}
			"week":  time.Now().Weekday().String(),            //传入到对应的html页面 {{ .week }}
			"date":  time.Now().Unix(),
			"num":   rand.Intn(100),
		})
	})

	//GET获取参数  http://localhost:8888/query1?username=zhangsan&age=22
	engine.GET("/query1", func(c *gin.Context) {
		//使用c.Query()获取url上的参数
		username := c.Query("username")
		age := c.Query("age")
		page := c.DefaultQuery("page", "1") //没有传递则默认为 "1"
		c.JSON(http.StatusOK, gin.H{
			"username": username,
			"age":      age,
			"page":     page,
		})
	})

	//GET请求-跳转到demo05/user.html   http://localhost:8888/user
	engine.GET("/user", func(c *gin.Context) {
		c.HTML(http.StatusOK, "demo05/user.html", gin.H{})
	})

	//GET  将get传递的参数绑定到结构体  http://localhost:8888/getUser?username=zhangsan&password=123 [结构体属性必须使用 `form:"xxx"`]
	engine.GET("/getUser", func(c *gin.Context) {
		user := UserInfo{}
		err := c.ShouldBindQuery(&user)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"msg": "参数错误",
			})
		} else {
			c.JSON(http.StatusOK, user)
		}
	})

	//POST-获取form表单的数据	http://localhost:8888/user 添加用户1
	engine.POST("/doAddUser1", func(c *gin.Context) {
		username := c.PostForm("username")
		password := c.PostForm("password")
		age := c.DefaultPostForm("age", "18") //没有传递则默认为 "18"
		c.JSON(http.StatusOK, gin.H{
			"username": username,
			"password": password,
			"age":      age,
		})
	})

	//post-获取form表单的数据,将参数绑定到结构体 http://localhost:8888/user  添加用户2： [结构体属性必须使用 `form:"xxx"`]
	engine.POST("/doAddUser2", func(c *gin.Context) {
		user := UserInfo{}
		err := c.ShouldBind(&user)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"msg": "参数错误",
			})
		} else {
			c.JSON(http.StatusOK, user)
		}
	})
	//POST 获取post请求的body的xml 然后将参数绑定到结构体
	//请求体为xml格式：
	//<article>
	//<content type="string">文章内容888</content>
	//<title ype="string">文章标题aaa</title>
	//</article>
	engine.POST("/doAddArticle", func(c *gin.Context) {
		data, _ := c.GetRawData()
		art := &Article{}
		err := xml.Unmarshal(data, art)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"msg": "参数错误",
			})
		} else {
			c.JSON(http.StatusOK, art)
		}
	})

	//GET动态路由 http://localhost:8888/query2/1001
	engine.GET("/query2/:id", func(c *gin.Context) {
		id := c.Param("id")
		c.JSON(http.StatusOK, gin.H{
			"id": id,
		})
	})

	engine.Run(":8888")
}

type UserInfo struct {
	UserName string `json:"username" form:"username"`
	Password string `json:"password" form:"password"`
}

type Article struct {
	Title   string `json:"title" xml:"title"`
	Content string `json:"content" xml:"content"`
}
